package es.gesfutbol.dao;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.hibernate.Hibernate;
import org.hibernate.LockMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;

import es.gesfutbol.domini.implementacio.Jornada;
import es.gesfutbol.domini.implementacio.Lliga;
import es.gesfutbol.util.HibernateDao;
import es.gesfutbol.util.HibernateHelper;

public class LligaDao extends HibernateDao<Lliga, Long> implements ILligaDao{

	@Transactional(readOnly=false)
	public void delete(Long idLliga) {
		//Obtenim la lliga a eliminar.
		Lliga lliga = this.findById(idLliga);
		//Eliminem la lliga.
		this.delete(lliga);			
	}
	
	@SuppressWarnings("deprecation")
	@Transactional(readOnly = true)
	public Lliga deproxy(Lliga lliga){		
		 	Set<Jornada> jornades = lliga.getJornades();
		 	this.getSessionFactory().getCurrentSession().lock(lliga, LockMode.NONE);
		 	Hibernate.initialize(jornades);
	        Iterator<Jornada> itJornada = jornades.iterator();
	        Set<Jornada> jornades2 = new HashSet<Jornada>();
	        while (itJornada.hasNext()) {
	            Jornada jornada = itJornada.next();
	            Hibernate.initialize(jornada);
	            jornada = HibernateHelper.deproxy(jornada, Jornada.class);
	            jornades2.add(jornada);
	        }
	        lliga.setJornades(jornades2);	        
	        return lliga;
	}
		
	@Transactional(readOnly=false)
	public void save(Lliga lliga) {
		this.getSessionFactory().getCurrentSession().saveOrUpdate(lliga);	
	}
	
	@Transactional(readOnly=false)
	public Lliga findLligaPerNomITemporada(String nom, String temporada) {
		return (Lliga) this.getSessionFactory().getCurrentSession().createCriteria(Lliga.class)	
		.add(Restrictions.eq("nom", nom))
		.add(Restrictions.eq("temporada", temporada))
		.uniqueResult();
	}
	
	@SuppressWarnings("unchecked")
	@Transactional(readOnly=false)
	public List<Lliga> findLliguesPerTemporada(String temporada) {		
		List<Lliga> lligues = this.getSessionFactory().getCurrentSession().createCriteria(Lliga.class)	
		.add(Restrictions.eq("temporada", temporada))
		.list();
		return lligues;
	}
	


}
